package cn.lumora.core.util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.Set;

/**
 * Redis 工具类（基于 Jedis 客户端）
 */
public class RedisUtil {

    private static final JedisPool jedisPool;

    static {
        // 初始化连接池配置
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(100);  // 最大连接数
        poolConfig.setMaxIdle(50);    // 最大空闲连接
        poolConfig.setMinIdle(10);    // 最小空闲连接
        poolConfig.setMaxWaitMillis(3000); // 获取连接最大等待时间
        poolConfig.setTestOnBorrow(true);  // 在获取连接时测试有效性

        // 初始化 Jedis 连接池
        jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);
    }

    /**
     * 获取 Jedis 实例
     */
    public static Jedis getJedis() {
        return jedisPool.getResource();
    }

    /**
     * 关闭 Jedis 实例
     */
    public static void closeJedis(Jedis jedis) {
        if (jedis != null) {
            jedis.close();
        }
    }

    /**
     * 设置 key-value（字符串类型）
     */
    public static void set(String key, String value) {
        try (Jedis jedis = getJedis()) {
            jedis.set(key, value);
        }
    }

    /**
     * 设置 key-value 并设置过期时间（秒）
     */
    public static void setex(String key, int seconds, String value) {
        try (Jedis jedis = getJedis()) {
            jedis.setex(key, seconds, value);
        }
    }

    /**
     * 获取 key 对应的值
     */
    public static String get(String key) {
        try (Jedis jedis = getJedis()) {
            return jedis.get(key);
        }
    }

    /**
     * 删除一个或多个 key
     */
    public static void del(String... keys) {
        try (Jedis jedis = getJedis()) {
            jedis.del(keys);
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }

    /**
     * 设置 key 的过期时间（秒）
     */
    public static void expire(String key, int seconds) {
        try (Jedis jedis = getJedis()) {
            jedis.expire(key, seconds);
        }
    }

    /**
     * 查找匹配的 key 集合
     */
    public static Set<String> keys(String pattern) {
        try (Jedis jedis = getJedis()) {
            return jedis.keys(pattern);
        }
    }

    /**
     * 判断 key 是否存在
     */
    public static boolean exists(String key) {
        try (Jedis jedis = getJedis()) {
            return jedis.exists(key);
        }
    }

    /**
     * 设置 key 的生存时间（毫秒）
     */
    public static void pexpire(String key, long milliseconds) {
        try (Jedis jedis = getJedis()) {
            jedis.pexpire(key, milliseconds);
        }
    }

    /**
     * 获取 key 的剩余生存时间（毫秒）
     */
    public static long ttl(String key) {
        try (Jedis jedis = getJedis()) {
            return jedis.ttl(key);
        }
    }

}
